/**
  ******************************************************************************
  * @file    main.c
  * @author  armwind
  * @version V1.0
  * @date    2019.10.1
  * @brief   看门狗的作用就是系统出现不可逆的情况下，通过复位系统来尝试解决问题。
  *                         这里看门狗最长等待时间是500ms,主程序会间隔100ms,打印一次hello world.由于打印
  *                         也需要时间，所以在打印完第4次后，系统就重启了。
  *  淘宝宝贝：https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debxjgygH&ft=t&id=626242045207
  ******************************************************************************
  */
#include "led.h"
#include "usart.h"
#include "log.h"

#define IWDG_CLOCK 40000
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
//如果日志等级大于LOG_DEBUG，则会打印该日志，反之不会。
#define LOG_LOCAL_LEVEL LOG_DEBUG
#define TAG  "MAIN:"

void config_iwdg()
{
    /* Check if the system has resumed from IWDG reset */
    if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {
      /* IWDGRST flag set */
         LOGI("clear iwdg reset flag");
      /* Clear reset flags */
         RCC_ClearFlag();
    }
    //下面是为了使能写时钟预分频寄存器和reload 寄存器。要不然是无法写这两个寄存器
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

    //这里我们产生500ms的看门狗，那么我们就配置为看门时钟为5K把，则预分频为IWDG_Prescaler_8
    //那么每一个时钟能增加(1s/5K)秒，则如果要
    //1000ms / 5K = 500ms / reload_value;
    //上面计算得reload_value = 2500; 这个小于最大4096满足
    IWDG_SetPrescaler(IWDG_Prescaler_8);
    //500ms后,如果不喂狗，系统会重启.
    IWDG_SetReload(2500);

    /* Reload IWDG counter */
    IWDG_ReloadCounter();

    /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
    IWDG_Enable();
}

int main(void)
{
  /* Add your application code here
   *
   */
    delay_init();
    usart_config(1,9600); //串口1波特率9600
    led_init();

    config_iwdg();
    //这里只是使能了看门狗，后面没有在喂狗了，所以这里最多打印5行“hello world”日志，实际只有4个，打印也需要时间
    //这里是实验，项目开发中不要忘了调用IWDG_ReloadCounter();进行喂狗
  /* Infinite loop */
    while (1) {
            LOGI("hello world!");
            delay_ms (100);
            //IWDG_ReloadCounter();//喂狗
    }
}
/************************ (C) COPYRIGHT weiduwulian*****END OF FILE****/
